package dahuiji.common.core;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import net.sf.json.JSONObject;
import dahuiji.common.entity.Line;
import dahuiji.common.entity.LineRecord;
import dahuiji.common.sysdata.CommonData;
import dahuiji.common.util.Constants;
import dahuiji.common.util.EncodingFormat;
import dahuiji.common.util.InitDataMemory;
import dahuiji.common.util.SendMail;

public class TaskJob extends Thread {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private LineData LineData = new LineData();// 得到所有的航线
	private DateCaozuo dateCaozuo = new DateCaozuo();
	private UrlCatch urlCatch;// 抓取数据
	private NoticeUser noticeUser = new NoticeUser();
	public static boolean gate = false;

	private TaskJob() {
		System.out.println("初始化线程，单利模式");
	}

	/**
	 * 静态内部类实现单列模式
	 * 
	 * @author zhangxin_e
	 * 
	 */
	private static class SingletonHolder {

		private final static TaskJob INSTANCE = new TaskJob();

	}

	/**
	 * 返回线程
	 * 
	 * @return
	 */
	public static TaskJob getInstance() {

		return SingletonHolder.INSTANCE;

	}

	public void run() {
		while (gate) {
			try{
			doIt();
			}catch (Exception e) {
                e.printStackTrace();
				System.out.println(e);
				System.out.println("系统坏了！！！！！！！！！！！");
			}
		}

	}

	/**
	 * 处理航线
	 */
	public void doIt() {
		Queue<Line> queue = new LinkedList<Line>();// 把航线放到队列了
		ArrayList<Line> list = (ArrayList<Line>) LineData.getAllLine();// 从内存里拿出所有线路
		if (list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				queue.add((Line) list.get(i));// 入列
			}
			urlCatch = new UrlCatch();
			while (queue.size() > 0) {
				String urlString = null;
				try {
					Line line = queue.peek();
					try {
						urlString = urlCatch.getURlString(line);// 根据用户的航线从网上抓数据
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//String ur = getString(EncodingFormat.iso2Utf(urlString));// 拿出json数据
                String ur = getString(EncodingFormat.iso2Utf(urlString));// 拿出json数据
				this.process(ur, queue.poll());// 处理这个航线
			}
			// 处理完后休眠
			try {
				InitDataMemory.cleanData();//清空内存数据
				InitDataMemory.initdate();// 重新初始化内存里的值
				this.sleep(30000);// 然后休眠
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	/**
	 * 网站核心
	 * 
	 * @param urlString
	 * @param line
	 */
	public void process(String urlString, Line line) {
		JSONObject jb = JSONObject.fromObject(urlString);
		JSONObject jsonObject = jb.getJSONObject("out");
		if (jsonObject.toString().equals("{}") || jsonObject.toString() == "{}") {
			// 说明这条航线有问题
			LineData.delLine(line);// 设置表里为错标记
			noticeUser.lineWrong(line);// 通知用户航线信息错误

		} else if (line.getTpye() == Constants.LINE_TYPE_ONE) {// 如果是具体日期
			if (line.getStatus() == Constants.LINE_RIGHT_YES) {// 如果这个line是对的
				// 遍历得到的数据
				Date lineDate = null;// 遍历到的日期
				for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) {
					String key = (String) iter.next();
					JSONObject Sline = (JSONObject) jsonObject.get(key);
					try {
						lineDate = dateCaozuo.toDate(Sline.getString("dt"));// 得到遍历到的日期
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					if (line.getfDate().equals(lineDate)) {// 是用户检测的那天
						int pr = Integer.parseInt(Sline.getString("pr"));// 得到遍历到的价格
						if (line.getPrice() > pr) {// 小于期望的价格
							if (line.getFlag() == Constants.LINE_SEND_NOTICE_NO) {// 没有发送过通知，那就发送通知并更新数据库
								// 发布通知
								noticeUser.noticeUserOneDate(line,
										Constants.FIRST_NOTICE_USER, pr);// 第一次通知
							} else if (line.getFlag() == Constants.LINE_SEND_NOTICE_YES) {// 通知过，得到最新的记录比较如果比最新的低就通知
								noticeUser.noticeUserOneDate(line,
										Constants.NOT_FIRST_NOTICE_USER, pr);
							}
						}
					}

				}
			}

		} else if (line.getTpye() == Constants.LINE_TYPE_TOWN) {// 如果是一段时间
			LineRecord lineRecord = null;
			List<LineRecord> lineRecordsNew = new ArrayList<LineRecord>();// 用来记录新发现的
			if (line.getStatus() == Constants.LINE_RIGHT_YES) {// 如果这个line是对的
				Date lineDate = null;// 遍历到的日期
				boolean ifNotice = false;// 用来标记之前已经已经发布通知的航线是否有必要再通知
				for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) {// 遍历数据
					String key = (String) iter.next();
					JSONObject Sline = (JSONObject) jsonObject.get(key);
					try {
						lineDate = dateCaozuo.toDate(Sline.getString("dt"));// 得到遍历到的日期
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					if ((lineDate.before(line.getToDate()) && lineDate
							.after(line.getfDate()))
							|| (lineDate.equals(line.getfDate()) || lineDate
									.equals(line.getToDate()))) {// 日期是用户关心的日期范围
						int pr = Integer.parseInt(Sline.getString("pr"));// 得到遍历到的价格
						if (line.getPrice() > pr) {// 小于期望的价格
							if (line.getFlag() == Constants.LINE_SEND_NOTICE_NO) {// 没有发送过通知，那就发送通知并更新数据库
								lineRecord = new LineRecord();
								lineRecord.setDate(dateCaozuo.getNowDate());
								lineRecord.setLindId(line.getId());
								lineRecord.setPrice((short) pr);
								lineRecord.setLineDate(lineDate);
								lineRecordsNew.add(lineRecord);
								ifNotice = true;// 没发过发吧
							} else if (line.getFlag() == Constants.LINE_SEND_NOTICE_YES) {// 通知过，得到最新的记录比较如果比最新的低就通知
								// 先看看这天的特价记录，不存在，如果小于pr就发，存在看看价格是否小于pr
								lineRecord = new LineRecord();
								lineRecord.setDate(dateCaozuo.getNowDate());
								lineRecord.setLindId(line.getId());
								lineRecord.setPrice((short) pr);
								lineRecord.setLineDate(lineDate);
								lineRecordsNew.add(lineRecord);
								ifNotice = true;
							}

						}
					}
				}
				if (ifNotice) {//
					// 发送通知
					// 还要记录下来那写天的价格
					noticeUser.noticeUserNotOneDay(line, lineRecordsNew);
				}

			}

		}
	}

	private static String getString(String s) {
		String r1 = s.substring(29);
		String r2 = r1.substring(0, r1.length() - 2);
		return r2;
	}

}
